Current File : /home/jeconsul/www/wp-content/plugins/suremails/src/screens/dashboard/recommended-plugins.js
// File: src/components/RecommendedPlugins.js
import { useState, memo } from '@wordpress/element';
import { Container, Label, Button, toast, Loader } from '@bsf/force-ui';
import Title from '@components/title/title';
import { __ } from '@wordpress/i18n';
import { useQuery, useQueryClient } from '@tanstack/react-query';
import { fetchInstalledPluginsData } from '@api/plugins';
import { recommendedPluginsData, pluginAddons } from 'utils/plugin-add-ons';
import { installAndActivatePlugin, activatePlugin } from 'utils/plugin-utils';

const RecommendedPlugins = () => {
	const [ installingPlugins, setInstallingPlugins ] = useState( [] );
	const [ activatingPlugins, setActivatingPlugins ] = useState( [] );
	const queryClient = useQueryClient();

	// 	// Ussing the fetchInstalledPluginsData from plugins api
	const { data: pluginsData } = useQuery( {
		queryKey: [ 'installed-plugins' ],
		queryFn: fetchInstalledPluginsData,
		refetchInterval: 100000,
		refetchOnMount: false,
		refetchOnWindowFocus: false,
		refetchOnReconnect: true,
	} );

	/**
	 * Render the appropriate action button based on plugin state.
	 *
	 * @param {Object} plugin - The plugin object.
	 * @return {JSX.Element|null} - The action button or null.
	 */
	const renderActionButton = ( plugin ) => {
		const isInstalling = installingPlugins.includes( plugin.slug );
		const isActivating = activatingPlugins.includes( plugin.slug );
		const isInstalled = pluginsData?.installed.includes( plugin.slug );
		const isActive = pluginsData?.active.includes( plugin.slug );

		if ( ! isInstalled ) {
			return (
				<Button
					variant="outline"
					className="no-underline border-border-subtle text-text-primary hover:no-underline [&_svg]:size-4"
					size="xs"
					onClick={ () =>
						installAndActivatePlugin(
							plugin,
							pluginsData,
							installingPlugins,
							activatingPlugins,
							setInstallingPlugins,
							setActivatingPlugins,
							queryClient,
							toast
						)
					}
					icon={
						( isInstalling || isActivating ) && (
							<Loader variant="primary" />
						)
					}
					iconPosition="left"
					disabled={
						isInstalling ||
						isActivating ||
						window?.suremails?.pluginInstallationPermission !== '1'
					}
				>
					{ __( 'Install & Activate', 'suremails' ) }
				</Button>
			);
		}

		if ( isInstalled && ! isActive ) {
			return (
				<Button
					variant="outline"
					className="no-underline bg-button-tertiary text-text-primary hover:no-underline border-border-subtle [&_svg]:size-4"
					size="xs"
					onClick={ () =>
						activatePlugin(
							plugin,
							pluginsData,
							installingPlugins,
							activatingPlugins,
							setActivatingPlugins,
							queryClient,
							toast
						)
					}
					disabled={ isInstalling || isActivating }
					icon={
						( isInstalling || isActivating ) && (
							<Loader variant="primary" />
						)
					}
					iconPosition="left"
				>
					{ __( 'Activate', 'suremails' ) }
				</Button>
			);
		}

		if ( isActive ) {
			return (
				<Button
					variant="outline"
					className="shadow-sm bg-badge-background-green text-text-primary border-border-subtle hover:no-underline"
					size="xs"
				>
					{ __( 'Activated', 'suremails' ) }
				</Button>
			);
		}

		return null;
	};

	return (
		<Container
			containerType="flex"
			gap="xs"
			direction="column"
			className="p-3 border-solid rounded-xl border-border-subtle border-0.5 gap-1"
		>
			<Container.Item className="md:w-full lg:w-full">
				<Container
					className="p-1"
					justify="between"
					gap="xs"
					align="center"
				>
					<Container.Item>
						<Title
							title={ __( 'Extend Your Website', 'suremails' ) }
							tag="h4"
						/>
					</Container.Item>
				</Container>
			</Container.Item>
			<Container.Item className="rounded-lg md:w-full lg:w-full bg-field-primary-background">
				<Container
					containerType="grid"
					className="gap-1 p-1 grid-cols-2 md:grid-cols-4 min-[1020px]:grid-cols-1 xl:grid-cols-2"
				>
					{ recommendedPluginsData.sequence.map( ( slug ) => {
						const card = pluginAddons.find(
							( p ) => p.slug === slug
						);
						if ( ! card ) {
							return null;
						}

						return (
							<Container.Item key={ card.slug } className="flex">
								<Container
									containerType="flex"
									direction="column"
									className="w-[190px] min-w-[144px] min-h-[135px] flex-1 gap-1 p-2 rounded-md shadow-soft-shadow-inner bg-background-primary"
								>
									<Container.Item>
										<Container className="items-center gap-1.5 p-1">
											<Container.Item
												className="[&>svg]:size-5 flex"
												grow={ 0 }
												shrink={ 0 }
											>
												{ card.svg }
											</Container.Item>
											<Container.Item className="flex">
												<Label className="text-sm font-medium">
													{ card.title }
												</Label>
											</Container.Item>
										</Container>
									</Container.Item>
									<Container.Item className="gap-0.5 p-1">
										<Label
											variant="help"
											className="text-sm font-normal text-text-tertiary"
										>
											{ recommendedPluginsData?.description ===
											'long_description'
												? card?.long_description
												: card?.short_description }
										</Label>
									</Container.Item>
									<Container.Item className="gap-0.5 px-1 pt-2 pb-1 mt-auto">
										{ renderActionButton( card ) }
									</Container.Item>
								</Container>
							</Container.Item>
						);
					} ) }
				</Container>
			</Container.Item>
		</Container>
	);
};

export default memo( RecommendedPlugins );